﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using SistemaDeBastanteodePoderes.Persistencia;
using SistemaDeBastanteodePoderes.Dominio;

namespace SistemaDeBastanteodePoderes.Pruebas.DAO
{
    public class Test_H2_1_TipoDocumentoDAO
    {
        ITipoDocumentoDAO tipoDocumentoDAO = null; // Utilizamos una referencia a la interfaz
        TipoDocumento tipoCreado = null;

        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            tipoDocumentoDAO = new Persistencia.NH.TipoDocumentoDAO(); // Elegimos la implementación DAO a probar (ADO ó NHibernate)
            foreach (TipoDocumento tipo in tipoDocumentoDAO.ListarTodos())
                tipoDocumentoDAO.Eliminar(tipo);
        }

        [Test]
        public void Test1_Crear()
        {
            TipoDocumento tipoACrear = new TipoDocumento();
            // 1. Validar que ocurra un error si no se ingresa el tipo corto del tipo de documento
            tipoACrear.TipCorto = null;
            tipoACrear.TipLargo = "DOCUMENTO";
            Assert.Catch<Exception>(delegate
            {
                tipoCreado = tipoDocumentoDAO.Crear(tipoACrear);
            });

            // 2. Validar que ocurra un error si no se ingresa tipo corto del tipo de documento
            tipoACrear.TipCorto = "ABREV";
            tipoACrear.TipLargo = null;
            Assert.Catch<Exception>(delegate
            {
                tipoCreado = tipoDocumentoDAO.Crear(tipoACrear);
            });

            // 3. Validar que se crea correctamente (sin error) el tipo de documento
            tipoACrear.TipCorto = "DNI";
            tipoACrear.TipLargo = "DOCUMENTO NACIONAL DE IDENTIDAD";
            Assert.DoesNotThrow(delegate
            {
                tipoCreado = tipoDocumentoDAO.Crear(tipoACrear);
            });

            // 4. Validar que ocurra un error si se trata de crear otro tipo de documento con el mismo tipo corto
            tipoACrear.TipCorto = "DNI";
            tipoACrear.TipLargo = "SEGUNDO DNI";
            Assert.Catch<Exception>(delegate
            {
                tipoCreado = tipoDocumentoDAO.Crear(tipoACrear);
            });

            // 5. Validar que se crea correctamente (sin error) un segundo tipo de documento
            tipoACrear.TipCorto = "CEX";
            tipoACrear.TipLargo = "CARNET DE EXTRANJERIA";
            Assert.DoesNotThrow(delegate
            {
                tipoCreado = tipoDocumentoDAO.Crear(tipoACrear);
            });

            // 6. Validar que el tipo creado no sea nulo, que tenga un código mayor que 0 y que tipo corto sea el ingresado
            Assert.IsNotNull(tipoCreado);
            Assert.Greater(tipoCreado.Codigo, 0);
            Assert.AreEqual(tipoCreado.TipCorto, tipoACrear.TipCorto);
        }
        [Test]
        public void Test2_Obtener()
        {
            TipoDocumento obtenido = null;
            // 1. Validar que si se intenta obtener un tipo de documento inexistente se retorne null
            Assert.DoesNotThrow(delegate
            {
                obtenido = tipoDocumentoDAO.Obtener(1000);
            });
            Assert.IsNull(obtenido);
            // 2. Validar que se obtenga un tipo de documento correctamente (sin error)
            Assert.DoesNotThrow(delegate
            {
                obtenido = tipoDocumentoDAO.Obtener(tipoCreado.Codigo);
            });
            Assert.IsNotNull(obtenido);
        }
        [Test]
        public void Test3_Modificar()
        {
            TipoDocumento tipoAModificar = tipoDocumentoDAO.Obtener(tipoCreado.Codigo);
            TipoDocumento tipoModificado = null;
            // 1. Validar que ocurre un error si la Abreviacion ingresada es nula
            tipoAModificar.TipCorto = null;
            Assert.Catch<Exception>(delegate
            {
                tipoModificado = tipoDocumentoDAO.Modificar(tipoAModificar);
            });
            // 2. Validar que se modifica correctamente (sin error) el tipo de documento
            tipoAModificar.TipCorto = "PSP";
            Assert.DoesNotThrow(delegate
            {
                tipoModificado = tipoDocumentoDAO.Modificar(tipoAModificar);
            });
            // 3. Validar que el tipo de documento modificado no sea nulo y la Abreviacion sea la ingresada
            Assert.IsNotNull(tipoModificado);
            Assert.AreEqual(tipoAModificar.TipCorto, tipoModificado.TipCorto);
        }
        [Test]
        public void Test4_Eliminar()
        {
            TipoDocumento tipoAEliminar = tipoDocumentoDAO.Obtener(tipoCreado.Codigo);
            // 1. Validar que ocurra un error si se intenta eliminar un tipo de documento inexistente
            Assert.Catch<Exception>(delegate
            {
                tipoDocumentoDAO.Eliminar(null);
            });
            // 2. Validar que se elimine un tipo de documento correctamente
            Assert.DoesNotThrow(delegate
            {
                tipoDocumentoDAO.Eliminar(tipoAEliminar);
            });
            // 3. Validar que el tipo de documento eliminado ya no exista
            TipoDocumento tipoEliminado = tipoDocumentoDAO.Obtener(tipoCreado.Codigo);
            Assert.IsNull(tipoEliminado);
        }
        [Test]
        public void Test5_Listar()
        {
            tipoDocumentoDAO.Crear(new TipoDocumento() { TipCorto = "TD1", TipLargo = "TIPO DOC 1" });
            tipoDocumentoDAO.Crear(new TipoDocumento() { TipCorto = "TD2", TipLargo = "TIPO DOC 2" });

            // 1. Validar que se listen sin errores los tipos de empresa creados
            ICollection<TipoDocumento> tiposExistentes = null;
            Assert.DoesNotThrow(delegate
            {
                tiposExistentes = tipoDocumentoDAO.ListarTodos();
            });
            // 2. Validar que retorne los 2 tipos de documento creados
            Assert.GreaterOrEqual(tiposExistentes.Count, 2);
            // 3. Validar que la Abreviacion de cada tipo de documento no sea nula
            foreach (TipoDocumento tipo in tiposExistentes)
                Assert.IsNotNull(tipo.TipCorto);
        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            foreach (TipoDocumento tipo in tipoDocumentoDAO.ListarTodos())
                tipoDocumentoDAO.Eliminar(tipo);
            Persistencia.NH.NHibernateHelper.CerrarFabrica();
        }
    }
}